#include <iostream>
#include <vector>
#include <future>
#include <thread>
using namespace std;

//异步的相加函数
//int async_add(int num1, int num2)
//{
//	std::this_thread::sleep_for(std::chrono::seconds(3));
//	return num1 + num2;
//}
//
////假设这个函数的功能是发送sd字符串
////ret表示收到的响应字符串
//bool send_sync(const string& sd, string& ret);			//阻塞版本
//
//bool send_async(const string& sd, future<string>& ret)	//异步版本
//{
//	//收到消息后往ret中写入数据
//	//xxxxx -> 表示写入过程
//
//	return true;
//}
//
//
//int main()
//{
//	future<string> ret;
//	
//	//调用异步版本的才不会阻塞
//	thread th(send_async, "hello world", ref(ret));
//	th.detach();
//
//	//在get之前可以执行别的逻辑,并不会阻塞
//
//	//如果数据没准备好会阻塞直到放入数据
//	ret.get();
//
//	return 0;
//}

//int main()
//{
//	//这个模板类型表示fu存储的是什么类型的变量
//	future<int> fu;
//	future<string> fu2;
//
//	//核心操作，获取他存储的变量，如果它并没有存储变量就会一直阻塞
//	//只能get获取一次，之后会失效
//	int a = fu.get();
//	
//	//第二次获取会抛出异常
//	fu.get();
//	
//	return 0;
//}


////异步的相加函数
//int async_add(int num1, int num2)
//{
//	//休眠三秒，模拟网络通信消耗的时间
//	std::this_thread::sleep_for(std::chrono::seconds(3));
//	return num1 + num2;
//}
//
//int main()
//{
//	future<int> f = async(launch::async,async_add, 1, 2);
//	
//	int ret = f.get();
//
//	//三秒之后打印 3
//	cout << ret << endl;
//	return 0;
//}

////异步的相加函数
//int async_add(int num1, int num2)
//{
//	//休眠三秒，模拟网络通信消耗的时间
//	std::this_thread::sleep_for(std::chrono::seconds(3));
//	return num1 + num2;
//}
//
//int main()
//{
//	packaged_task<int(int, int)> task(async_add);
//	future<int> f = task.get_future();
//
//	//这个要自己启动线程来执行了
//	//task对象拷贝构造被封了，所以只能移动语义来转移资源
//	//就是保证只有一份，future也是如此
//	thread t(move(task), 5, 6);
//
//
//	int ret = f.get();
//
//	//三秒之后打印 3
//	cout << ret << endl;
//
//	t.join();
//	return 0;
//}

//异步的相加函数
void async_add(promise<int> p, int num1, int num2)
{
	//休眠三秒，模拟网络通信消耗的时间
	std::this_thread::sleep_for(std::chrono::seconds(3));
	//手动设置，只能设置一次
	p.set_value(num1 + num2);
}

int main()
{
	promise<int> pri;
	future<int> f = pri.get_future();

	//这个也要自己启动线程来执行
	//promise对象拷贝构造被封了，通过移动语义来转移资源
	//保证只有一份，future也是如此
	thread t(async_add,move(pri),10,20);

	int ret = f.get();

	//三秒之后打印 30
	cout << ret << endl;

	t.join();
	return 0;
}
